package steed.util.digest;

import javax.crypto.Cipher;
import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import steed.util.base.BaseUtil;

/**
 * aes gcm 加密模式
 * 
 * @author battlesteed
 *
 */
public class AESGCMUtil {
	
	/**
	 * 加密/解密
	 * 
	 * @param byteContent 加密或解密的内容
	 * @param key 密钥
	 * @param mode 模式 Cipher.ENCRYPT_MODE/Cipher.DECRYPT_MODE
	 * @param iv 向量
	 * @param tag tag
	 * 
	 * @return 加密或解密后的内容
	 */
	private static byte[] docrypt(byte[] byteContent, byte[] key,int mode,byte[] iv,byte[] tag) {
		try {
			SecretKeySpec kee = new SecretKeySpec(key, "AES");
			Cipher cipher = Cipher.getInstance("AES/GCM/PKCS5Padding");// 创建密码器
			
			cipher.init(mode, kee,new GCMParameterSpec(tag.length*8, iv));// 初始化
			cipher.updateAAD(tag);
			
			cipher.update(byteContent);
			return cipher.doFinal();
		} catch (Exception e) {
			BaseUtil.getLogger().error("aes加密/解密 失败!",e);
		} 
		return null;
	}

	/**
	 * 加密
	 * 
	 * @param byteContent 加密的内容
	 * @param key 密钥
	 * @param iv 向量
	 * @param tag tag
	 * 
	 * @return 加密后的内容
	 */
	public static byte[] encrypt(byte[] byteContent, byte[] key,byte[] iv,byte[] tag) {
		return docrypt(byteContent, key, Cipher.ENCRYPT_MODE, iv, tag);
	}
	/**
	 * 解密
	 * 
	 * @param byteContent 解密的内容
	 * @param key 密钥
	 * @param iv 向量
	 * @param tag tag
	 * 
	 * @return 解密后的内容
	 */
	public static byte[] decrypt(byte[] byteContent, byte[] key,byte[] iv,byte[] tag) {
		return docrypt(byteContent, key, Cipher.DECRYPT_MODE, iv, tag);
	}

	

}